/**
 * @(#)CoordinadorBundlesReemplazoPredefinido 3/11/11
 *
 * Copyright (c) 2005-2010 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n:3/11/11 - 07:24 PM PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>3/11/11 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.i18n.reemplazoPredefinido;

import com.psiqueware.alheli.i18n.CoordinadorBundles;

import java.util.Collection;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * {@link CoordinadorBundles} que acepta un {@link ResourceBundle} y un {@link CoordinadorBundles} hijo.
 * <p/>
 * Del {@link ResourceBundle} se obtendr&aacute;n todos los valores que se pidan en todos los contextos y solo se recurrir&aacute;
 * al {@link CoordinadorBundles} hijo en caso de que se pida alg&uacute;n valor no definido en el {@link ResourceBundle}.
 * <p/>
 * Se acepta un par&aacute;metro con una {@link Collection} de {@link Locale} que indicar&aacute;n los lenguajes para los que
 * se tienen valores en el {@link ResourceBundle}. Si esta lista es <code>null</code> se utilizar&aacute;n los valores por defecto
 * del {@link ResourceBundle} par&aacute;metro para todos los {@link Locale} que se busquen.
 * <p/>
 * <br/>Paquete Original: com.psiqueware.alheli.i18n.propertyBundles
 * <br/>Nombre  Original: CoordinadorBundlesReemplazoPredefinido
 * <br/>Oprima para ver : <a href="CoordinadorBundlesReemplazoPredefinido.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a>
 * @version Revision: 1.1 3/11/11 07:24 PM
 * @noinspection UnusedDeclaration
 */
public final class CoordinadorBundlesReemplazoPredefinido implements CoordinadorBundles
{

    /**
     * {@link CoordinadorBundles} de donde se obtendr&aacute;n los valores en caso de no estar predefinidos.
     */
    private final CoordinadorBundles m_coordinadorBundlesFaltantes;

    /**
     * Valores a reemplazar.
     */
    private ResourceBundle m_reemplazos;

    /**
     * {@link Collection} de {@link Locale} para los cuales se tienen definiciones de reemplazo; puede ser <code>null</code> lo que significa que las definiciones funcionan para todos los {@link Locale}.
     */
    private final Collection<Locale> m_locales;

    /**
     * Constructor de CoordinadorBundlesReemplazoPredefinido.
     *
     * @param coordinadorBundlesFaltantes para obtener los valores en caso de que no se encuentren en el {@link ResourceBundle} reemplazos.
     * @param reemplazos                  conjunto de valores para obtener por defecto.
     * @param locales                     para los cuales se tienen definiciones de reemplazo; puede ser <code>null</code> lo que significa que las definiciones funcionan para todos los {@link Locale}.
     *
     * @noinspection UnusedDeclaration
     */
    public CoordinadorBundlesReemplazoPredefinido(final CoordinadorBundles coordinadorBundlesFaltantes, final ResourceBundle reemplazos, final Collection<Locale> locales)
    {
        m_coordinadorBundlesFaltantes = coordinadorBundlesFaltantes;
        m_reemplazos = reemplazos;
        m_locales = locales;
    }


    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada.
     *
     * @param contexto en el que se definir&aacute; el Bundle.
     * @param baseName nombre base del bundle.
     */
    @Override
    public void agregarResourceBundle(final String contexto, final String baseName)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(contexto, baseName);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada.
     *
     * @param contexto      en el que se definir&aacute; el Bundle.
     * @param classBaseName nombre base del bundle.
     */
    @Override
    public void agregarResourceBundle(final String contexto, final Class classBaseName)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(contexto, classBaseName);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada.
     *
     * @param baseName nombre base del bundle.
     */
    @Override
    public void agregarResourceBundle(final String baseName)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(baseName);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada.
     *
     * @param classBaseName nombre base del bundle.
     */
    @Override
    public void agregarResourceBundle(final Class classBaseName)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(classBaseName);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada y lo devuelve.
     *
     * @param contexto en el que se definir&aacute; el Bundle.
     * @param baseName nombre base del bundle.
     * @param locale   {@link java.util.Locale} del bundle buscado.
     *
     * @return {@link java.util.ResourceBundle} buscado.
     */
    @Override
    public ResourceBundle agregaBuscaResourceBundle(final String contexto, final String baseName, final Locale locale)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(contexto, baseName);
        return getBundle(locale, contexto);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada y lo devuelve.
     *
     * @param contexto      en el que se definir&aacute; el Bundle.
     * @param classBaseName nombre base del bundle.
     * @param locale        {@link java.util.Locale} del bundle buscado.
     *
     * @return {@link java.util.ResourceBundle} buscado.
     */
    @Override
    public ResourceBundle agregaBuscaResourceBundle(final String contexto, final Class classBaseName, final Locale locale)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(contexto, classBaseName);
        return getBundle(locale, contexto);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada y lo devuelve.
     *
     * @param classBaseName nombre base del bundle.
     * @param locale        {@link java.util.Locale} del bundle buscado.
     *
     * @return {@link java.util.ResourceBundle} buscado.
     */
    @Override
    public ResourceBundle agregaBuscaResourceBundle(final Class classBaseName, final Locale locale)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(classBaseName);
        return agregaBuscaResourceBundle("", classBaseName, locale);
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada y lo devuelve.
     *
     * @param baseName nombre base del bundle.
     *
     * @return {@link java.util.ResourceBundle} buscado.
     */
    @Override
    public ResourceBundle agregaBuscaResourceBundle(final String baseName)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(baseName);
        return agregaBuscaResourceBundle("", baseName, Locale.getDefault());
    }

    /**
     * Agrega un {@link java.util.ResourceBundle} a la colecci&oacute;n coordinada y lo devuelve.
     *
     * @param classBaseName nombre base del bundle.
     *
     * @return {@link java.util.ResourceBundle} buscado.
     */
    @Override
    public ResourceBundle agregaBuscaResourceBundle(final Class classBaseName)
    {
        m_coordinadorBundlesFaltantes.agregarResourceBundle(classBaseName);
        return agregaBuscaResourceBundle("", classBaseName, Locale.getDefault());
    }

    /**
     * Devuelve un ResourceBundle para un {@link java.util.Locale} y contexto espec&iacute;ficos.
     *
     * @param locale   localidad cuyos recursos se buscan.
     * @param contexto para el Bundle.
     *
     * @return {@link java.util.ResourceBundle}.
     */
    @Override
    public ResourceBundle getBundle(final Locale locale, final String contexto)
    {
        if (null == m_locales || (null != locale && m_locales.contains(locale)))
        {
            return new ResourceBundleReemplazoPredefinido(m_reemplazos, m_coordinadorBundlesFaltantes, locale, contexto);
        }
        else
        {
            return m_coordinadorBundlesFaltantes.getBundle(locale, contexto);
        }
    }

    /**
     * Devuelve un ResourceBundle para el {@link java.util.Locale} sin importarle el contexto de los recursos.
     *
     * @param locale localidad cuyos recursos se buscan.
     *
     * @return {@link java.util.ResourceBundle}.
     */
    @Override
    public ResourceBundle getBundle(final Locale locale)
    {
        return getBundle(locale, "");
    }

    /**
     * Devuelve un ResourceBundle sin importarle el contexto de los recursos y utilizando el {@link java.util.Locale} por defecto.
     *
     * @return {@link java.util.ResourceBundle}.
     */
    @Override
    public ResourceBundle getBundle()
    {
        return getBundle(Locale.getDefault());
    }
}

